package com.campus.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
@Slf4j
public class PerformanceLogAspect {

    /**
     * 定义切点：用户模块中的所有查询方法（以 select 开头）
     */
    @Pointcut("execution(public * com.campus.dao..*select*(..))")
    public void selectMethodsInUser(){}

    /**
     * 定义切点：DAO 层的所有方法
     */
    @Pointcut("within(com.campus.dao..*)")
    public void daoLayerJoinPoints() {}

    /**
     * 定义切点：服务层的所有方法
     */
    @Pointcut("execution(* com.campus.service..*.*(..))")
    public void serviceLayer(){}

    /**
     * 性能日志：拦截 DAO 层所有方法，记录方法执行时间
     */
    @Around("daoLayerJoinPoints()")
    public Object performanceLog(ProceedingJoinPoint pjp) {
        Long startTime = System.currentTimeMillis();
        Object ret = null;
        try {
            ret = pjp.proceed();
            log.info("Method: " + pjp.getSignature().getName() +
                    ", executed in: " + (System.currentTimeMillis() - startTime) / 1000.0 + " s");
            return ret;
        } catch (Throwable e) {
            log.error("Error: " + e.getMessage());
            return ret;
        }
    }
}
